package com.example.leo.mycharmingstudent.a08280829;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;

import com.example.leo.mycharmingstudent.R;

/**
 * 使用Fragment的流程：
 * 1.创建对应的或者是依赖的Activity
 * 2.findViews()
 * 3.创建Fragment
 * 4.创建Fragment布局
 * 5.回到Activity，开始下面操作
 * 获取manager，开启事务，添加fragment，提交
 * 注意：v4包的Fragment只能依赖v4包的FragmentActivity
 * FragmentClazzActivity是v4包FragmentActivity的子类
 * so，FragmentClazzActivity可以罩着v4包的Fragment，
 * 也就是说，v4包的Fragment可以依赖FragmentClazzActivity
 */
public class FragmentClazzActivity extends AppCompatActivity
        implements View.OnClickListener,ClazzPracticeFragment.OnListener {

    //标题
    public TextView tvTitle;
    //切换 fragment的按钮
    private ToggleButton tgToggleFragment;
    //展示信息   Fragment调用相应方法，修改此文本显示
    private TextView tvShowInfo;
    //控制Fragment内容展示0
    private TextView tvControl0;
    //控制Fragment内容展示1
    private TextView tvControl1;
    //fragment的容器布局
    private FrameLayout flContainer;
    private Fragment mFragment0;
    private Fragment mFragment1;
    //普通方式创建的fragment
    private ClazzPracticeFragment mClazzPracticeFragment;
    private ClazzPracticeFragment mCharmingGrilFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment_clazz);

        findViews();
        initData();
        initEvent();
    }

    /**
     * 寻找控件 findViewById
     * 变量名称长一点没有关系，但是必须表明含义
     */
    private void findViews() {
        tvTitle = findViewById(R.id.tv_title_activity_fragment_clazz);
        tgToggleFragment = findViewById(R.id.tg_toggle_fragment_activity_fragment_clazz);
        tvShowInfo = findViewById(R.id.tv_show_info_activity_fragment_clazz);
        tvControl0 = findViewById(R.id.tv_control_fragment_content_activity_fragment_clazz0);
        tvControl1 = findViewById(R.id.tv_control_fragment_content_activity_fragment_clazz1);
        flContainer = findViewById(R.id.fl_container_activity_fragment_clazz);
    }

    private void initData() {
        mFragment0 = ClazzPracticeFragment.newInstance("mFragment0");
        mFragment1 = ClazzPracticeFragment.newInstance("mFragment1");

//        new Test();
//        Test test = Test.newInstance();

        //作为一个优秀且专业的开发者，不推荐使用这方式
        //因为可能会传递很多参数，可能会有遗漏
        mClazzPracticeFragment = new ClazzPracticeFragment();
        mClazzPracticeFragment.setOnListener(this);
        Bundle bundle = new Bundle();
        bundle.putString(ClazzPracticeFragment.FRAGMENT_NAME, "普通方式创建的Fragment");
        mClazzPracticeFragment.setArguments(bundle);

        mCharmingGrilFragment = ClazzPracticeFragment.newInstance(
                "Alice",
                "女",
                "28岁",
                "180cm",
                "180kg");
        mCharmingGrilFragment.setOnListener(this);

        //注意看到Transaction（事务）这个单词，
        // 一定会对应一个提交方法，一般情况下命名为commit。
        //使用Fragment的细节实现：
        getSupportFragmentManager()
                .beginTransaction()
                //到这一步了，返回给我了一个Transaction事务，
                //我是不是就可以拿着这个Transaction事务继续往下玩
                .add(R.id.fl_container_activity_fragment_clazz, mClazzPracticeFragment, "clazzFragment0")
                .add(R.id.fl_container_activity_fragment_clazz, mCharmingGrilFragment, "clazzFragment1")
                //解决了一个bug
                .hide(mCharmingGrilFragment)
                .commit();

        /*FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.add();
        transaction.add();
        transaction.commit();*/
    }

    private void initEvent() {
        // TODO: 2020/8/29  思考：为什么可以用this 提示：面向对象-多态特性
        tvTitle.setOnClickListener(this);
        tgToggleFragment.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                //show 和 hide 方法只是显示和隐藏的作用
                if (isChecked) {
                    FragmentTransaction transaction = getSupportFragmentManager()
                            .beginTransaction();
                    transaction
                            .show(mClazzPracticeFragment)
                            .hide(mCharmingGrilFragment)
                            .commit();
                } else {
                    getSupportFragmentManager()
                            .beginTransaction()
                            .show(mCharmingGrilFragment)
                            .hide(mClazzPracticeFragment)
                            .commit();
                }
            }
        });
        tvControl0.setOnClickListener(this);
        tvControl1.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.tv_title_activity_fragment_clazz:
                //开始了咱们的replace过程
                getSupportFragmentManager()
                        .beginTransaction()
                        .replace(R.id.fl_container_activity_fragment_clazz,
                                ClazzPracticeFragment.newInstance("我是replace"), "replace")
                        .commit();
                break;
            case R.id.tv_control_fragment_content_activity_fragment_clazz0:
                mClazzPracticeFragment.setContent("Fragment,你已经被我控制了，0");
                break;
            case R.id.tv_control_fragment_content_activity_fragment_clazz1:
                mCharmingGrilFragment.setContent("美丽的女孩纸，吃个饭吧");
                break;
            //开发规范，必须写default。为什么呢？告诉别人就是没啥好写的代码，就是没有实现。
            default:
                break;
        }
    }

    /**
     * Fragment如何调用此方法呢？
     * 这是一个难题
     *
     * @param info
     */
    public void setShowInfo(String info) {
        tvShowInfo.setText(info);
    }

    @Override
    public void changeText(String text) {
        tvShowInfo.setText(text);
    }

    @Override
    public void showToast(String toast) {
        Toast.makeText(this, toast, Toast.LENGTH_LONG).show();
    }
}
/*
总结：
1.创建Activity
2.findViews:findViewById 查找布局和控件
3.创建v4包Fragment
4.创建Fragment布局
5.回到Activity，开始什么操作呢？
获取manager 开启事务  添加  提交
完成了

换个思路：
1.创建Fragment及布局
2.创建Activity
3.实现
 */